package com.bright.ghj.overt.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * @author Tz
 * @date 2024/01/22 15:03
 * @Description 异步任务执行情况信息的枚举
 */
@Getter
@AllArgsConstructor
public enum AsyncTaskExecInfo {

    /**
     * 待执行
     */
    TODO_EXEC(0, "待执行"),

    /**
     * 正在执行
     */
    EXECUTING(1, "正在执行"),

    /**
     * 执行成功
     */
    EXECUTION_SUCCESSFUL(2, "执行成功"),

    /**
     * 执行失败 (程序运行后，结果错误)
     */
    EXECUTION_FAILED(-1, "执行失败"),

    /**
     * 执行取消
     */
    EXECUTION_CANCEL(-2, "执行取消"),

    /**
     * 执行错误 (程序异常导致的错误)
     */
    EXECUTION_ERROR(-3, "执行错误");

    private final Integer status;
    private final String info;

    /**
     * 根据类别获取状态列表
     * @param  category 类别 0：全部，1：处理中，2：成功，3：失败
     * @return 状态列表
     */
    public static List<Integer> getStatusFromCategory(Integer category) {
        switch (category) {
            case 1:
                return Arrays.asList(TODO_EXEC.status, EXECUTING.status);
            case 2:
                return Collections.singletonList(EXECUTION_SUCCESSFUL.status);
            case 3:
                return Arrays.asList(EXECUTION_FAILED.status, EXECUTION_CANCEL.status, EXECUTION_ERROR.status);
            default:
                return Arrays.asList(TODO_EXEC.status
                        , EXECUTING.status
                        , EXECUTION_SUCCESSFUL.status
                        , EXECUTION_FAILED.status
                        , EXECUTION_CANCEL.status
                        , EXECUTION_ERROR.status);
        }
    }

    /**
     * 根据执行状态获取对应的状态分类
     * @param status 执行状态
     * @return       状态分类
     */
    public static Integer getCategoryFromStatus(Integer status) {
        if (TODO_EXEC.status.equals(status) || EXECUTING.status.equals(status)){
            return 1;
        } else if (EXECUTION_SUCCESSFUL.status.equals(status)) {
            return 2;
        } else if (EXECUTION_FAILED.status.equals(status) || EXECUTION_CANCEL.status.equals(status) || EXECUTION_ERROR.status.equals(status)) {
            return 3;
        } else {
            return 0;
        }
    }
}
